package com.ruoyi.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.dto.ContractCreateDTO;
import com.ruoyi.system.dto.ContractDTO;
import com.ruoyi.system.dto.ContractUpdateDTO;
import com.ruoyi.system.dto.ContractAuditDTO;
import com.ruoyi.system.entity.ContractDO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

public interface ContractService extends IService<ContractDO> {
    /**
     * 根据ID获取合同
     */
    ContractDTO getById(Long id);

    /**
     * 获取所有合同
     */
    List<ContractDTO> listAll();

    /**
     * 创建合同
     */
    ContractDTO create(ContractCreateDTO dto);

    // 新增带文件上传的方法
    ContractDTO createWithFiles(ContractCreateDTO dto);

    /**
     * 更新合同
     */
    ContractDTO update(ContractUpdateDTO dto);

    /**
     * 根据ID删除合同
     */
    boolean deleteById(Long id);

    /**
     * 根据合同类型查询合同
     */
    List<ContractDTO> getByContractType(String contractType);

    /**
     * 多条件筛选合同集合
     * @param projectName 项目名称（模糊匹配）
     * @param projectAddress 项目地址（模糊匹配）
     * @param stage 业务阶段
     * @param contractSigner 合同签订人
     * @param contractType 合同类型
     * @param contractName 合同名称（模糊匹配）
     * @param signStartDate 签订开始时间
     * @param signEndDate 签订结束时间
     * @return 筛选后的合同DTO集合
     */
    List<ContractDTO> listByCondition(String projectId, String projectName, String projectAddress,
                                      String stage, String contractSigner, String contractType,
                                      String contractName, Integer auditStatus, LocalDate signStartDate, LocalDate signEndDate);

    /**
     * 统计合同客户数：签过合同且审核通过（一个项目存在多个合同，只要有一个审核通过即可计入）。
     * 当前以项目ID去重统计项目客户数。
     */
    long countApprovedContractCustomers();

    /**
     * 管理员月视图：每天签单项目数（仅统计审核通过合同，对项目ID去重）。
     * 返回key=yyyy-MM-dd, value=count。
     */
    Map<String, Integer> approvedSignedProjectsDaily(LocalDate month);

    /**
     * 管理员按天查询签单项目列表（审核通过的合同，按项目去重）。
     */
    List<com.ruoyi.system.dto.ProjectDTO> approvedSignedProjectsByDate(LocalDate date);

    /**
     * 下载合同所有附件的压缩包
     * @param contractId 合同ID
     * @param response HTTP响应对象
     */
    void downloadContractAttachmentsAsZip(Long contractId, javax.servlet.http.HttpServletResponse response);

    /**
     * 审核通过合同
     * @param auditDTO 审核信息
     */
    void approveContract(ContractAuditDTO auditDTO);

    /**
     * 审核拒绝合同
     * @param auditDTO 审核信息
     */
    void rejectContract(ContractAuditDTO auditDTO);
}
